package br.usp.ime.ingpos.services;

import java.util.Date;
import java.util.List;

import br.com.caelum.vraptor.core.Localization;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.usp.ime.ingpos.modelo.Candidato;
import br.usp.ime.ingpos.modelo.CartaDeRecomendacao;
import br.usp.ime.ingpos.modelo.Inscricao;
import br.usp.ime.ingpos.modelo.TipoProcessoSeletivo;
import br.usp.ime.ingpos.modelo.Usuario;
import br.usp.ime.ingpos.modelo.dao.CandidatoDAO;
import br.usp.ime.ingpos.seguranca.Criptografia;
import br.usp.ime.ingpos.web.controllers.UsuarioSessao;

@RequestScoped
@Component
public class CandidatoService
{
    private final UsuarioSessao usuarioSessao;
    private final UsuarioService usuarioService;
    private final CandidatoDAO candidatoDAO;
    private final EmailService emailService;
    private final Localization localization;

    public CandidatoService(
        UsuarioSessao usuarioSessao,
        UsuarioService usuarioService,
        CandidatoDAO candidatoDAO,
        EmailService emailService,
        Localization localization )
    {
        this.usuarioSessao = usuarioSessao;
        this.usuarioService = usuarioService;
        this.candidatoDAO = candidatoDAO;
        this.emailService = emailService;
        this.localization = localization;
    }

    public void salvar(
        final Candidato candidato )
    {
        candidatoDAO.save( candidato );
    }

    public void atualizar(
        final Candidato candidato )
    {
        candidatoDAO.saveOrUpdate( candidato );
    }

    public List<Candidato> listaTodos()
    {
        return candidatoDAO.findAll();
    }

    public Candidato getCandidatoAtual()
    {
        final Usuario usuario = usuarioService.procurarPorId( usuarioSessao.getUsuario().getUsuarioID() );
        return (Candidato) usuario;
    }

    public void enviarEmailAprovados(
        List<Inscricao> inscricoes )
    {
        try {
            for( Inscricao inscricao : inscricoes ) {
                emailService.enviarEmail( emailService.construirEmail(
                    localization.getMessage( "aprovado_email_msg_assunto" ),
                    construirConteudoAprovado( inscricao )+localization.getMessage( "email_rodape"),
                    inscricao.getCandidato().getEmail() ) );
            }
        } catch( EmailException e ) {
            e.printStackTrace();
            throw new IllegalStateException( "Nao conseguiu enviar email" );
        }
    }

    private String construirConteudoAprovado(
        Inscricao inscricao )
    {

        Candidato candidato = inscricao.getCandidato();
        final String curso = localization.getMessage( "computacao" );
        final String paginaInfoMatricula = localization.getMessage( "pagina_info_matricula" );
        final TipoProcessoSeletivo tipoProcesso = inscricao.getProcessoSeletivo().getTipoProcessoSeletivo();
        String conteudo = localization.getMessage( "aprovado_email_msg_conteudo",
            candidato.getDadosPessoais().getNomeCompleto(), tipoProcesso, curso,
            paginaInfoMatricula );

        return conteudo;
    }

    public void enviarEmailReprovados(
        List<Inscricao> inscricoes )
    {
        if( inscricoes != null ) {
            try {
                for( Inscricao inscricao : inscricoes ) {
                    emailService.enviarEmail( emailService.construirEmail(
                        localization.getMessage( "reprovado_email_msg_assunto" ),
                        construirConteudoReprovado( inscricao )+localization.getMessage( "email_rodape"),
                        inscricao.getCandidato().getEmail() ) );
                }
            } catch( EmailException e ) {
                e.printStackTrace();
                throw new IllegalStateException( "Nao conseguiu enviar email" );
            }
        }
    }

    private String construirConteudoReprovado(
        Inscricao inscricao )
    {
        Candidato candidato = inscricao.getCandidato();
        final TipoProcessoSeletivo tipoProcesso = inscricao.getProcessoSeletivo().getTipoProcessoSeletivo();
        final String curso = localization.getMessage( "computacao" );
        String conteudo = localization.getMessage( "reprovado_email_msg_conteudo", candidato.getDadosPessoais().getNomeCompleto(), tipoProcesso, curso );

        return conteudo;
    }

}